/**
 * 给一个移动序列，机器人从(0, 0)开始移动，每次上下左右走一格。
 * 然后将这个移动序列重复K次，求全过程中到原点的最大曼哈顿距离
 * 假设一个周期移动(U, V)
 * 则所有点的坐标表示为 (kU+Xi, kV+Yi)
 * 考虑到对固定a和b, 函数f(k)=|kU+a|+|kV+b|是一个开口向下的凸函数
 * 三段折线。因此必然在端点取到最值。
 * 只需检查 k=0与k=K-1即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

int N, K;
string S;

llt proc(){
    vector<pair<llt, llt>> coor(N + 1);
    coor[0] = {0, 0};
    for(int i=1;i<=N;++i){
        coor[i] = coor[i - 1];
        switch(S[i - 1]){
            case 'D': coor[i].second -= 1; break;
            case 'U': coor[i].second += 1; break;
            case 'L': coor[i].first -= 1; break;
            case 'R': coor[i].first += 1; break;
            default: assert(0);
        }
    }
    llt u = coor[N].first, v = coor[N].second;
    llt ans = 0;
    for(int i=1;i<=N;++i){
        ans = max(ans, abs(coor[i].first) + abs(coor[i].second));
        ans = max(ans, abs((K - 1LL) * u + coor[i].first) + abs((K - 1LL) * v + coor[i].second));
    }
    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> K >> S;
        cout << proc() << endl;   
    }
    return 0;
}